home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Carnage_Contest / scripts / CC Original / weapons / Rat.lua < prev    next >
Text File  |  2010-09-22  |  7KB  |  204 lines

  1. --------------------------------------------------------------------------------
  2. -- Weapon Rat + Projectile Rat
  3. -- Original Carnage Contest Weapon
  4. -- Script by DC, March 2010, www.UnrealSoftware.de
  5. --------------------------------------------------------------------------------
  6.  
  7. -- Setup Tables
  8. if cc==nil then cc={} end
  9. cc.rat={}
  10. cc.rat.rat={}
  11.  
  12. -- Load & Prepare Ressources
  13. cc.rat.gfx_wpn0=loadgfx("weapons/rat0.bmp")                    -- Weapon Image Frame 0
  14. setmidhandle(cc.rat.gfx_wpn0)
  15. cc.rat.gfx_wpn1=loadgfx("weapons/rat1.bmp")                    -- Weapon Image Frame 1
  16. setmidhandle(cc.rat.gfx_wpn1)
  17. cc.rat.sfx_attack=loadsfx("rat.ogg")                        -- Attack Sound
  18. cc.rat.sfx_step=loadsfx("ratstep.ogg")                        -- Step Sound
  19.  
  20. --------------------------------------------------------------------------------
  21. -- Weapon: Rat
  22. --------------------------------------------------------------------------------
  23.  
  24. cc.rat.id=addweapon("cc.rat","Rat Attack",cc.rat.gfx_wpn0,1,2)            -- Add Weapon (1 use, first in round 2)
  25.  
  26. function cc.rat.draw()                                                    -- Draw
  27.     -- Draw
  28.     if weapon_shots<=0 then
  29.         -- Info
  30.         hudinfo("Hit [Space] once to launch the rat!")
  31.         if getplayeraction(0)==0 then
  32.             setblend(blend_alpha)
  33.             setalpha(1)
  34.             setcolor(255,255,255)
  35.             setscale(getplayerdirection(0),1)
  36.             setrotation(-(20+math.sin(os.clock()*30)*15)*getplayerdirection(0))
  37.             drawimage(cc.rat.gfx_wpn0,getplayerx(0)+getplayerdirection(0)*7,getplayery(0)-1)
  38.         end
  39.     end
  40. end
  41.  
  42. function cc.rat.attack(attack)                                    -- Attack
  43.     if (weapon_shots<=0) then
  44.         -- Fire a projectile (on release/full charge)
  45.         if (attack==1) then
  46.             -- No more weapon switching!
  47.             useweapon(0)
  48.             -- No more player control!
  49.             playercontrol(0)
  50.             -- Set Round Time (15 sec)
  51.             secondsleft=math.floor(getframesleft()/50)
  52.             changeturntime(15-secondsleft)
  53.             -- Launch
  54.             weapon_shots=weapon_shots+1
  55.             id=createprojectile(cc.rat.rat.id)
  56.             projectiles[id]={}
  57.             -- Ignore collision with current player at beginning
  58.             projectiles[id].ignore=playercurrent()
  59.             -- Set initial position of projectile
  60.             projectiles[id].x=getplayerx(0)+getplayerdirection(0)*8
  61.             projectiles[id].y=getplayery(0)
  62.             if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  63.                 if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  64.                     projectiles[id].x=getplayerx(0)
  65.                 end
  66.             end
  67.             projectiles[id].px=projectiles[id].x
  68.             projectiles[id].py=projectiles[id].y
  69.             -- Set Speeds
  70.             projectiles[id].sy=0
  71.             -- Set direction of projectile
  72.             projectiles[id].dir=getplayerdirection(0)
  73.             -- Animation
  74.             projectiles[id].frame=0
  75.             projectiles[id].timer=0
  76.             -- Timer
  77.             weapon_timer=50
  78.             -- Sound
  79.             playsound(cc.rat.sfx_attack)
  80.         end
  81.     end
  82. end
  83.  
  84. --------------------------------------------------------------------------------
  85. -- Projectile: Rat
  86. --------------------------------------------------------------------------------
  87.  
  88. cc.rat.rat.id=addprojectile("cc.rat.rat")        -- Add Projectile
  89.  
  90. function cc.rat.rat.draw(id)                    -- Draw
  91.     -- Setup draw mode
  92.     setblend(blend_alpha)
  93.     setalpha(1)
  94.     setcolor(255,255,255)
  95.     setscale(1,1)
  96.     -- Calculate projectile rotation
  97.     if projectiles[id].dir==1 then
  98.         setrotation(math.deg(math.atan2(projectiles[id].x-projectiles[id].px,-(projectiles[id].y-projectiles[id].py)))+270)
  99.     else
  100.         setscale(1,-1)
  101.         setrotation(math.deg(math.atan2(projectiles[id].x-projectiles[id].px,-(projectiles[id].y-projectiles[id].py)))-90)
  102.     end
  103.     -- Draw projectile
  104.     if projectiles[id].frame==0 then
  105.         drawimage(cc.rat.gfx_wpn0,projectiles[id].x,projectiles[id].y-2)
  106.     else
  107.         drawimage(cc.rat.gfx_wpn1,projectiles[id].x,projectiles[id].y-2)
  108.     end
  109.     -- Draw Arrow if out of Screen
  110.     outofscreenarrow(projectiles[id].x,projectiles[id].y)
  111.     -- Info
  112.     hudinfo("Hit [Space] again to detonate the rat!")
  113. end
  114.  
  115. function cc.rat.rat.update(id)                            -- Update
  116.     -- Save old position (for rotation calculation)
  117.     if getframesleft()%15==0 then
  118.         projectiles[id].px=projectiles[id].x
  119.         projectiles[id].py=projectiles[id].y
  120.     end
  121.     -- Timer
  122.     weapon_timer=weapon_timer-1
  123.     -- Animation
  124.     projectiles[id].timer=projectiles[id].timer+1
  125.     if projectiles[id].timer>7 then
  126.         projectiles[id].timer=0
  127.         projectiles[id].frame=1-projectiles[id].frame
  128.     end
  129.     -- Move Left/Right
  130.     projectiles[id].x=projectiles[id].x+projectiles[id].dir
  131.     if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  132.         if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  133.             -- Upwards/Downwards space?
  134.             doturn=1
  135.             for i=1,14,1 do
  136.                 if (i%2)==1 then offset=(i+1)/2 else offset=-(i/2) end
  137.                 if collision(col5x5,projectiles[id].x,projectiles[id].y+offset)==0 then
  138.                     doturn=0; projectiles[id].ignore=0 projectiles[id].y=projectiles[id].y+offset; break
  139.                 elseif terraincollision()==0 and objectcollision()==0 and playercollision()==projectiles[id].ignore then
  140.                     doturn=0; projectiles[id].y=projectiles[id].y+offset; break
  141.                 end
  142.             end
  143.             if doturn==1 then
  144.                 -- Move Back / Turn
  145.                 projectiles[id].x=projectiles[id].x-projectiles[id].dir
  146.                 projectiles[id].dir=projectiles[id].dir*(-1)
  147.                 projectiles[id].px=projectiles[id].x
  148.                 projectiles[id].py=projectiles[id].y
  149.             end
  150.         end
  151.     else
  152.         projectiles[id].ignore=0
  153.     end
  154.     -- Fall Down
  155.     projectiles[id].sy=projectiles[id].sy+getgravity()*2
  156.     msubt=math.ceil(math.abs(projectiles[id].sy)/3)
  157.     msuby=projectiles[id].sy/msubt
  158.     for i=1,msubt,1 do
  159.         projectiles[id].y=projectiles[id].y+msuby
  160.         -- Collision
  161.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  162.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  163.                 if projectiles[id].timer==0 or projectiles[id].sy>0.5 then
  164.                     playsound(cc.rat.sfx_step)
  165.                 end
  166.                 projectiles[id].sy=0
  167.                 projectiles[id].y=projectiles[id].y-msuby
  168.                 break
  169.             end
  170.         else
  171.             projectiles[id].ignore=0
  172.         end
  173.         -- Water (Swim)
  174.         if (projectiles[id].y)>getwatery()-40 then
  175.             projectiles[id].sy=0
  176.             projectiles[id].y=getwatery()-40
  177.             if (getframesleft()%20)==0 then
  178.                 playsound(sfx_waterstep)
  179.             end
  180.         end
  181.     end
  182.     -- Timer / Explode
  183.     if getframesleft()<5 or (weapon_timer<=0 and keydown(key_attack)==1) then
  184.         -- Splatter
  185.         playsound(sfx_splatter2)
  186.         -- Cause damage
  187.         arealdamage(projectiles[id].x,projectiles[id].y,90,50)
  188.         -- Destroy terrain
  189.         terrainexplosion(projectiles[id].x,projectiles[id].y,35,1)
  190.         -- Crater
  191.         grey=math.random(0,40)
  192.         if math.random(0,1)==1 then
  193.             terrainalphaimage(gfx_crater100,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,grey,grey,grey)
  194.         else
  195.             terrainalphaimage(gfx_crater125,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,grey,grey,grey)
  196.         end
  197.         -- Free projectile
  198.         freeprojectile(id)
  199.         -- End Turn
  200.         endturn()
  201.     end
  202.     -- Scroll to projectile
  203.     scroll(projectiles[id].x,projectiles[id].y)
  204. end